package pe.com.pgn.consolidadorventas.servidorcentral.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import org.apache.log4j.Logger;

public class ReportGenerator{
	
	static Logger logger = Logger.getLogger(ReportGenerator.class);
	
	/** 
	 * Nombre de la carpeta donde se encuentra el fichero jasper 
	 * desde la raiz del contexto web  , ejm : /WEB-INF/reportes/ con el '/' al final
	 */
	private String ubicacionJasper; 
	
	/**
	 * Nombre del Fichero Jasper
	 */
	private String nombreJasper;
	
	/**
	 * Nombre del reporte en pdf
	 */
	private String nombreReportePDF;
	
	/**
	 * Parametros del reporte
	 */
	private Map<String, String> parametrosReporte;
	
	/**
	 * Coleccion de datos para el dataSource
	 */
	private List<? extends Object> camposReporte;
	
	private String ubicacionJRXML;
	private String nombreJRXML;
	
	public void generarPDF(ServletContext srvcontext,HttpServletResponse response){
		JRBeanCollectionDataSource dataSource;
		File file;
		JasperPrint jasperPrint;
		byte[] pdf;
		try{
			dataSource = new JRBeanCollectionDataSource(camposReporte);
			file = new File(srvcontext.getRealPath(ubicacionJasper+nombreJasper));
			jasperPrint = JasperFillManager.fillReport(new FileInputStream(file),parametrosReporte,dataSource); 
			pdf = JasperExportManager.exportReportToPdf(jasperPrint);
			response.addHeader("Content-disposition", "attachment;filename="+nombreReportePDF);
			response.setContentType("application/pdf"); 
			response.setContentLength(pdf.length);
			ServletOutputStream salida = response.getOutputStream();
			salida.write(pdf, 0, pdf.length);
			salida.flush();
			salida.close();
		}catch(Exception e){
			logger.error(e.getMessage());
		}	
	}
	
	public void generarPDFdeJRXML(ServletContext srvcontext,HttpServletResponse response){
		JRBeanCollectionDataSource dataSource;
		JasperPrint jasperPrint;
		JasperReport report;
		byte[] pdf;
		ServletOutputStream salida;
		String rutaJRXML;
		dataSource = new JRBeanCollectionDataSource(camposReporte);

		try{
			rutaJRXML = srvcontext.getRealPath(ubicacionJRXML+nombreJRXML);
			report = JasperCompileManager.compileReport(rutaJRXML);
			jasperPrint = JasperFillManager.fillReport(report, parametrosReporte, dataSource);
			pdf = JasperExportManager.exportReportToPdf(jasperPrint);
			response.addHeader("Content-disposition", "attachment;filename="+nombreReportePDF);
			response.setContentType("application/pdf");
			response.setContentLength(pdf.length);
			salida = response.getOutputStream();
			salida.write(pdf, 0, pdf.length);
			salida.flush();
			salida.close();

		}catch(JRException e){
			logger.error(e.getMessage());
		}catch(IOException ioe){
			logger.error(ioe.getMessage());
		}
	}

	public String getUbicacionJasper() {
		return ubicacionJasper;
	}

	public void setUbicacionJasper(String ubicacionJasper) {
		this.ubicacionJasper = ubicacionJasper;
	}

	public String getNombreJasper() {
		return nombreJasper;
	}

	public void setNombreJasper(String nombreJasper) {
		this.nombreJasper = nombreJasper;
	}

	public String getNombreReportePDF() {
		return nombreReportePDF;
	}

	public void setNombreReportePDF(String nombreReportePDF) {
		this.nombreReportePDF = nombreReportePDF;
	}

	public Map<String, String> getParametrosReporte() {
		return parametrosReporte;
	}

	public void setParametrosReporte(Map<String, String> parametrosReporte) {
		this.parametrosReporte = parametrosReporte;
	}

	public List<? extends Object> getCamposReporte() {
		return camposReporte;
	}

	public void setCamposReporte(List<? extends Object> camposReporte) {
		this.camposReporte = camposReporte;
	}

	public String getUbicacionJRXML() {
		return ubicacionJRXML;
	}

	public void setUbicacionJRXML(String ubicacionJRXML) {
		this.ubicacionJRXML = ubicacionJRXML;
	}

	public String getNombreJRXML() {
		return nombreJRXML;
	}

	public void setNombreJRXML(String nombreJRXML) {
		this.nombreJRXML = nombreJRXML;
	}
 
}